package cn.xioabai.common.utility;

import cn.hutool.json.JSONUtil;
import cn.xioabai.common.constant.JsonStrConstant;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;

import java.util.Objects;

/**
 * @Author yangdaji
 * @Date 2022/11/8 0008
 * @PackageName cn.xioabai.utils
 * @ClassName JsonUtils
 */
public class JsonUtils {

    private static ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 判断是否是单个json
     *
     * @param content 字符串数据
     * @return
     */
    public static Boolean isJsonString(String content) {
        content = content.trim();
        if (StringUtils.isEmpty(content)) {
            return false;
        }
        if (!content.startsWith(JsonStrConstant.LEFT_CURLY_BRACES) ||
                !content.endsWith(JsonStrConstant.RIGHT_CURLY_BRACES)) {
            return false;
        }
        return jsonStr(content);

    }

    /**
     * 判断是否是JSON 数组格式
     *
     * @param content 字符串数据
     * @return
     */
    public static Boolean isJsonListString(String content) {
        content = content.trim();
        if (StringUtils.isEmpty(content)) {
            return false;
        }
        if (!content.startsWith(JsonStrConstant.LEFT_BRACKETS) ||
                !content.endsWith(JsonStrConstant.RIGHT_BRACKETS)) {
            return false;
        }
        return jsonStr(content);
    }

    /**
     * 转换json
     *
     * @param content
     * @return
     */
    private static Boolean jsonStr(String content) {
        try {
            JSONUtil.toJsonStr(content);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 将json字符串转换成指定类型
     *
     * @param json json字符串
     * @param v    类型
     * @param <V>
     * @return
     */
    public static <V> V readValue(String json, TypeReference<V> v) {
        if (StringUtils.isBlank(json)) {
            return null;
        }
        try {
            return objectMapper.readValue(json, v);
        } catch (JsonProcessingException e) {
            return null;
        }
    }

    /**
     * 将对象转换JSON字符串,格式化后的字符串
     *
     * @param jsonData JSON 对象
     * @return
     */
    public static String toJsonStr(Object jsonData) {
        if (Objects.isNull(jsonData)) {
            return null;
        }
        try {
            return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonData);
        } catch (JsonProcessingException e) {
            return null;
        }
    }
}
